package com.cskaoyan.mr.wordcount;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;
import java.util.StringTokenizer;

/**
 * @ClassName WordCountMapper
 * @Description:
 * Mapper泛型中的四个参数分别代表
 * keyin：输入的key类型
 * valuein：输入的value类型
 * keyout：输出的key类型
 * valueouot：输出的value类型
 * 有一点需要特别指出的是在hadoop中，字符串、整数等类型不可以使用java里面的String、int等
 * 为什么呢？
 * 因为集群中需要进行传递，那么肯定需要一些持久化方式，需要将数据进行持久化，所以必须使用其提供的包装类
 * java语言中的String对应hadoop中是叫做Text
 * java语言中的int对应hadoop中是IntWritable类型
 * java语言中的null对应hadoop是NullWritable类型
 * java语言中的long对应hadoop是LongWritable类型
 * @Author 远志 zhangsong@cskaoyan.onaliyun.com
 * @Date 2023/2/13 11:02
 * @Version V1.0
 **/
public class WordCountMapper extends Mapper<Object, Text, Text, IntWritable> {

    //你可以理解为这个就是在hadoop中int的包装类
    private IntWritable one = new IntWritable(1);
    /**
     * wordcount
     * mapreduce会将数据拆分成一行一行的，第二个参数value，其实就是每一行数据
     * @param key
     * @param value
     * @param context
     * @throws IOException
     * @throws InterruptedException
     */
    @Override
    protected void map(Object key, Text value, Context context) throws IOException, InterruptedException {
        //首先需要将每一行数据利用空格分割成单个的字符
        StringTokenizer tokenizer = new StringTokenizer(value.toString());
        while (tokenizer.hasMoreTokens()){
            String character = tokenizer.nextToken();
            context.write(new Text(character), one);
        }
    }
}
